/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package baseDatos;

import entidades.DetalleMuerte;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.sql.DATE;

/**
 *
 * @author Facundo
 */
public class DetalleMuerteDAO {

    private String query;
    private Connection conDB;
    private PreparedStatement pst;

    public DetalleMuerteDAO(Connection con) {
        this.conDB = con;
    }

    public DetalleMuerteDAO() {
    }

    /**
     * @return the query
     */
    public String getQuery() {
        return query;
    }

    /**
     * @param query the query to set
     */
    public void setQuery(String query) {
        this.query = query;
    }

    /**
     * @return the conDB
     */
    public Connection getConDB() {
        return conDB;
    }

    /**
     * @param conDB the conDB to set
     */
    public void setConDB(Connection conDB) {
        this.conDB = conDB;
    }

    /**
     * @return the pst
     */
    public PreparedStatement getPst() {
        return pst;
    }

    /**
     * @param pst the pst to set
     */
    public void setPst(PreparedStatement pst) {
        this.pst = pst;
    }

    /*
     * Metodo para insertar un detalle de muerte
     * Recibe por parametro un objeto Detalle de muerte
     * El detalle se inserta en la base con los siguientes datos:
     * codigo_detalle
     * fecha_muerte
     * codigo_causa
     * codigo_historial
     */
    public boolean put(DetalleMuerte detalle, int codigoHistorial) {
        boolean ret = false;
        try {
                /*
                 * buscamos el codigo de la causa de muerte
                 */
                int codigoCausa = new CausaMuerteDAO(this.getConDB()).devolverCodigoCausaMuerte(detalle.getTipo_muerte().getNombre());
                /*
                 * buscamos el numero del ultimo detalle de muerte registrado y le sumamos uno
                 */
                int codigoDetalleMuerte = this.getUltimoCodigo();
                if(codigoDetalleMuerte==-1)
                    codigoDetalleMuerte = codigoDetalleMuerte+2;
                else
                    codigoDetalleMuerte = codigoDetalleMuerte+1;
                /*
                 * Manejamos la fecha de muerte
                 */
//                String fecha = detalle.getFecha_muerte().toString();
//                String fecha_dia = fecha.substring(8);
//                String fecha_año = fecha.substring(0,4);
//                String fecha_mes = fecha.substring(5,7);
                /*
                 * aca verificamos que no exista un detalle  de muerte. Es decir no puede haber mas de un detalle
                 * de muerte para un animal.
                 */
                 DetalleMuerte aux = this.getDetalleMuerteCodigoHistorial(codigoHistorial);
                 System.out.println("en detalle de muerteeeeeeee");
                 if(aux==null){
                     System.out.println("en detalle de muerteeeeeeee22222222222");
                     System.out.println();
                     setQuery("insert into PC_DETALLE_MUERTE (codigo_detalle,fecha_muerte,codigo_causa,codigo_historial)" +
                    " values ("+ codigoDetalleMuerte + ", to_date('" + detalle.getFecha_muerte().dateValue() +  "','YYYY-MM-DD'),"+
                    codigoCausa + "," + codigoHistorial + ")");
                    setPst(getConDB().prepareStatement(getQuery()));

                    ret = getPst().execute();
                    getPst().close();
                    return true;
                 }
        } catch (SQLException ex) {
            Logger.getLogger(DetalleMuerteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }

    /*
     * Metodo que devuelve un detalle de muerte de acuerdo al codigo del historial del mismo recibido
     * por parametro. Ya que cada historial puede tener una sola muerte
     */
    public DetalleMuerte getDetalleMuerteCodigoHistorial(int codigoHistorial){
        DetalleMuerte detalle = null;
        setQuery("select * from PC_DETALLE_MUERTE where codigo_historial=" + codigoHistorial);
        detalle = this.devolverDetalleMuerte(getQuery());
        return detalle;
    }

    /*
     * Metodo que devuelve un detalle de muerte de acuerdo al codigo del mismo recibido por parametro
     */
    public DetalleMuerte getDetalleMuerte(int codigo){
        DetalleMuerte detalle = null;
        setQuery("select * from PC_DETALLE_MUERTE where codigo_detalle=" + codigo);
        detalle = this.devolverDetalleMuerte(getQuery());
        return detalle;
    }

    /*
     * Metodo que devuelve un detalle de muerte de acuerdo a la sentencia recibida por parametro
     */
    private DetalleMuerte devolverDetalleMuerte(String sentencia) {
        DetalleMuerte detalle = null;
        ResultSet rs = null;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                detalle = new DetalleMuerte();
                detalle.setFecha_muerte(new DATE(rs.getDate("fecha_muerte")));
                detalle.setTipo_muerte(new CausaMuerteDAO(this.getConDB()).getCausaMuerte(rs.getInt("codigo_causa")));
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(DetalleMuerteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return detalle;
    }

     /*
     * Metodo que devuelve un ArrayList con un detalle de muerte de acuerdo al codigo del historial del
     * mismo recibido por parametro. Ya que cada historial puede tener una sola muerte
     */
    public ArrayList getDetalleMuerteArray(int codigoHistorial){
        ArrayList detalle = null;
        setQuery("select * from PC_DETALLE_MUERTE where codigo_historial=" + codigoHistorial);
        detalle = this.devolverDetalleMuerteArray(getQuery());
        return detalle;
    }

    /*
     * Metodo que devuelve un detalle de muerte de acuerdo a la sentencia recibida por parametro
     */
    private ArrayList devolverDetalleMuerteArray(String sentencia) {
        ArrayList lista = null;
        DetalleMuerte detalle = null;
        ResultSet rs = null;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            
            while (rs.next()) {
                lista = new ArrayList();
                detalle = new DetalleMuerte();
                detalle.setFecha_muerte(new DATE(rs.getDate("fecha_muerte")));
                detalle.setTipo_muerte(new CausaMuerteDAO(this.getConDB()).getCausaMuerte(rs.getInt("codigo_causa")));
                lista.add(detalle);
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(DetalleMuerteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return lista;
    }


    /*
     * Metodo que devuelve el codigo de un detalle de muerte registrado en la base. Recibe como parametro
     * un codigo de historial y retorna el codigo.
     */
    public int getCodigoDetalleMuerte(int codigoHistorial){
       setQuery("select codigo_detalle from PC_DETALLE_MUERTE where codigo_historial=" + codigoHistorial);
       int codigo = this.devolverCodigoDetalleMuerte(getQuery());
       return codigo;

    }

    /*
    * Metodo que devuelve el codigo del ultimo detalle de muerte registrado en la base
    */
    public int getUltimoCodigo(){
       setQuery("select MAX(codigo_detalle) AS codigo_detalle from PC_DETALLE_MUERTE");
       int codigo = this.devolverCodigoDetalleMuerte(getQuery());
       return codigo;

    }

    /*
     * Metodo que devuelve el codigo de un detalle de muerte, de acuerdo a la sentencia recibida por parametro
     */
     private int devolverCodigoDetalleMuerte(String sentencia) {
        int codigo = -1;
        ResultSet rs = null;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                if(String.valueOf(rs.getInt("codigo_detalle"))!=null){
                    codigo = rs.getInt("codigo_detalle");
                }
            }
            getPst().close();
            rs.close();
        } catch (SQLException ex) {
            Logger.getLogger(DetalleMuerteDAO.class.getName()).log(Level.SEVERE, null, ex);
        }

        return codigo;
    }

}
